/*
 * Wielkie liczby
 *
 * Napisz klasę umożliwiającą wykonywanie obliczeń na wielkich liczbach całkowitych.
 *
 * class DuzaLiczba
 * char *wartosc;
 * .....
 * public:
 * .....
 *
 * Liczby reprezentowane są jako łańcuchy znaków o dowolnej długości. Klasę należy zaimplementować tak,
 * aby wykonanie poniższej funkcji main było poprawne. Należy pamiętać o konieczności implementacji
 * wszystkich niezbędnych konstruktorów, operatorów, destruktorów, oraz o przedefiniowaniu wszystkich operatorów
 * co jest istotą tej części projektu.
 * Jeżeli w chwili obecnej nie wiesz co i jak zdefiniować, to większość wątpliwości zostanie "rozwiana" na tych
 * i na następnych zajęciach (mam taką nadzieję).
 *
 * #include "DuzaLiczba.h"
 *
 * int main(){
 * // konstruktor bezargumentowy inicjalizuje obiekt wartością 0
 * DuzaLiczba l1;
 * // konstruktor z argumentem typu int inicjalizuje obiekt wartością stało-liczbową
 * DuzaLiczba l2(172834);
 * // konstruktor z argumentem typu char* inicjalizuje obiekt podaną wartością
 * DuzaLiczba l3(“172839023498234792834798237494”);
 * // konstruktor kopiujący głęboko
 * DuzaLiczba l4(l3);
 * // też konstruktor kopiujący głęboko
 * DuzaLiczba l5=l4;
 * DuzaLiczba l6(-172834);
 *
 * DuzaLiczba *l7 = new DuzaLiczba(“-172839023498234792834798237494”);
 *
 * // Wszystkie obiekty od l1 do l6 są obiektami statycznymi,
 * // tzn. istnieją od początku do końca działania funkcji main
 * // natomiast obiekt wskazywany przez wskaźnik l7 jest
 * // obiektem dynamicznym, tzn. może być usunięty przez wywołanie
 * // operatora delete.
 *
 * // przedefiniowany operator >>
 * cin >> l1;
 * // przedefiniowany operator <<
 * cout << l1 << l2 << l3 << l4 << l5 << l6 << *l7;
 *
 * // usunięcie obiektu wskazywanego przez l7
 *
 * delete l7;
 *
 * // przedefiniowany operator =
 * l1 = l2;
 * // przedefiniowane operatory +-* /dzielenie całkowite
 * l1 = l1 + l2 - l3 * l4 / l5;
 *
 * // przedefiniowany operator +=
 * l1 += 23;
 * // przedefiniowany operator +=
 * l1 += l4;
 * // przedefiniowany operator -=
 * l2 -= l3;
 * // przedefiniowany operator *=
 * l3 *= l4;
 *
 * // przedefiniowany operator ==
 * if(l4 == "23424")
 * // przedefiniowany operator /= dzielenie całkowite
 * l4 /= l5;
 *
 * // przedefiniowany operator !=
 * if(l5 != l4) {
 * // przedefiniowany jednoargumentowy operator -
 * l5 = -l5;
 * cout << l5;
 * }
 *
 * // przedefiniowany operator =
 * l2 = "1221";
 *
 * DuzaLiczba silnia = 0;
 * // przedefiniowane operatory >= <
 * if(l2 >= 0 && l2 < "1223")
 * {
 * // przedefiniowany operator !
 * silnia = !l2;
 * cout << silnia;
 * }
 *
 * return 0;
 * }
 *
 * Version: $Id: main.cpp 85 2012-01-17 00:41:30Z s8376@pjwstk.edu.pl $
 */
#include <iostream>
#include "DuzaLiczba.h"

using namespace std;

int main()
{
    // konstruktor bezargumentowy inicjalizuje obiekt wartością 0
    DuzaLiczba l1;
    // konstruktor z argumentem typu int inicjalizuje obiekt wartością stało-liczbową
    DuzaLiczba l2(172834);
    // konstruktor z argumentem typu char* inicjalizuje obiekt podaną wartością
    DuzaLiczba l3("172839023498234792834798237494");
    // konstruktor kopiujący głęboko
    DuzaLiczba l4(l3);
    // też konstruktor kopiujący głęboko
    DuzaLiczba l5 = l4;
    DuzaLiczba l6(-172834);

    DuzaLiczba *l7 = new DuzaLiczba("-172839023498234792834798237494");

    // Wszystkie obiekty od l1 do l6 są obiektami statycznymi,
    // tzn. istnieją od początku do końca działania funkcji main
    // natomiast obiekt wskazywany przez wskaźnik l7 jest
    // obiektem dynamicznym, tzn. może być usunięty przez wywołanie
    // operatora delete.


    // przedefiniowany operator >>
    cin >> l1;
    // przedefiniowany operator <<
    cout << l1 << endl
            << l2 << endl
            << l3 << endl
            << l4 << endl
            << l5 << endl
            << l6 << endl
            << *l7 << endl;

    // usunięcie obiektu wskazywanego przez l7
    delete l7;

    // przedefiniowany operator =
    l1 = l2;
    // przedefiniowane operatory +-*/ dzielenie całkowite
    l1 = l1 + l2 - l3 * l4 / l5;

    // przedefiniowany operator +=
    l1 += 23;
    // przedefiniowany operator +=
    l1 += l4;
    // przedefiniowany operator -=
    l2 -= l3;
    // przedefiniowany operator *=
    l3 *= l4;

    // przedefiniowany operator ==
    if (l4 == "23424")
        // przedefiniowany operator /= dzielenie całkowite
        l4 /= l5;

    // przedefiniowany operator !=
    if (l5 != l4) {
        // przedefiniowany jednoargumentowy operator -
        l5 = -l5;
        cout << l5;
    }

    // przedefiniowany operator =
    l2 = "1221";

    DuzaLiczba silnia = 0;
    // przedefiniowane operatory >= <
    if (l2 >= 0 && l2 < "1223") {
        // przedefiniowany operator !
        silnia = !l2;
        cout << silnia;
    }

    return 0;
}
